
/*  Задача 2 Об'єднання двох нечітких множин. min(a+b,1). */
test(X) :- X = [[a,0.5], [b,0.3], [c,1]].

cutsum(A,B,X) :- X is min(A+B,1).

setcount([],_,X) :- X is 0.
setcount([[E,C]|St],X,Count) :- (E = X) -> Count is C; setcount(St,X,Count).

multisetcount([],_,X) :- X is 0.
multisetcount([[E,C]|St],X,Count) :- multisetcount(St,X,Rest), (E = X) -> Count is C+Rest; Count is Rest;

haskey([],K) :- false.
haskey([[E,C]|St],K) :- (K = E) -> true; haskey(St,K).

condpush(X,El,R) :- member(El,X) -> true; append(X,[El],R).

union(A,B,R) :- append(A,B,X), filter(X,Res), R is Res.

% union(A,[[E,C]

/*
Задача 3
Список ребер перетворити в матрицю суміжності.
*/

/* Перелічити суміжні вершини
:- dynamic resm/2

transedge([]).
transedge([[A,B]|T]) :- assertz(resm(A,B)),transedge(T).

chained(X,Y) :- resm(X,Y); resm(Y,X).

run3 :- transedge([[1,2],[2,3],[3,4],[4,1]]).
*/
:- dynamic resm/2.
:- dynamic edge/1.

transedges([]).
transedges([[A,B]|T]) :- assertz(resm(A,B)),assertz(edge(A)),assertz(edge(B)),transedges(T).

chained(X,Y) :- resm(X,Y); resm(Y,X).

run3 :- X = [[1,2],[2,3],[3,4],[4,1]], transedges(X), write(X).
:- run3.


% Задача 4
% Список з підсписками. Знайти всі елементи що відповідають умові і вивести їх. (Наприклад всі цілі від 1 до 3 і всі символи від "a" до "f".

test2(X) :- X = [[1,5,6], [[],a,ggg,d],3,3,d,[e,f]].
islist([]).
islist([H|T]).

cond(X) :- (X = 1); (X = 2); (X = 3); (X = a); (X = b); (X = c); (X = d); (X = e); (X = f).


condwrite(X) :- cond(X) -> write(X), nl,!.
condwrite(X) :- islist(X) -> writeall(X).
condwrite(X).

writeall([]) :- true.
writeall([H|T]) :- condwrite(H), writeall(T).
